package linker

import "sort"

// MergeableSection 和一个 InputSection 对应
// 一个 InputSection 会被拆成多个 MergeableSection
// 再把拆开的 MergeableSection 放到 MergedSection 中
type MergeableSection struct {
	Parent      *MergedSection
	P2Align     uint8
	Strings     []string
	FragOffsets []uint32
	Fragments   []*SectionFragment
}

// GetFragment 根据对应的偏移量的到对应的section 中sectionFragment
// 这里的offset 是在 Section 中 偏移为 offset 的符号在 SectionFragment 中的 offset
func (m *MergeableSection) GetFragment(offset uint32) (*SectionFragment, uint32) {
	// 返回 大于offset 的第一个下标
	position := sort.Search(len(m.Fragments), func(i int) bool {
		return offset < m.FragOffsets[i]
	})

	if position == 0 {
		return nil, 0
	}

	// 因为这个位置是大于 offset 的最小下标
	//
	index := position - 1
	return m.Fragments[index], offset - m.FragOffsets[index]
}
